package com.bestcem.xm.label.dao;

import com.bestcem.xm.label.entity.pojo.LabelDO;
import com.bestcem.xm.label.service.dto.label.LabelDTO;

import javax.annotation.Nullable;
import javax.validation.constraints.NotNull;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 标签数据访问服务
 *
 * @author yf.wang <yf.wang@idiaoyan.com>
 * @version V1.0
 * @date 2021/5/21
 */
public interface LabelDao {

    /**
     * 根据标签名称、组织id, 联系人类型查询标签
     *
     * @param name  标签名称
     * @param orgId 组织id
     * @return List<LabelDO>
     */
    Integer countByNameAndOrgId(String name, String orgId);

    /**
     * 新增标签
     *
     * @param labelDO 标签
     * @return LabelDO
     */
    String save(LabelDO labelDO);

    /**
     * 根据标签id获取该标签信息
     *
     * @param id 标签id
     * @return LabelDO
     */
    LabelDO getById(String id);

    /**
     * 标签更新
     *
     * @param labelDO UpdateLabelParam
     * @return
     */
    Boolean updateLabel(LabelDO labelDO);


    /**
     * 根据 标签id 删除标签
     *
     * @param id 标签id
     */
    Boolean delete(String id);

    /**
     * 删除标签组下所有的标签(不包括标签值)
     *
     * @param orgId        企业标识
     * @param labelGroupId 标签组ID
     * @return 删除的标签信息
     */
    List<LabelDO> deleteAndListByLabelGroupId(@Nullable String orgId, @NotNull String labelGroupId);

    /**
     * 根据 id 列表, 批量获取标签信息
     *
     * @param ids 标签id列表
     * @return List<LabelDTO>
     */
    List<LabelDTO> listByIds(List<String> ids);

    /**
     * 根据标签组id列表获取所属的标签
     *
     * @param groupIds   标签组id列表
     * @return List<LabelDTO>
     */
    List<LabelDTO> listByLabelGroupIds(List<String> groupIds);

    /**
     * 根据入参更新标签
     *
     * @param labelDO 标签
     * @return LabelDO
     */
    LabelDO insertOrReplace(LabelDO labelDO);

    /**
     * 获取该组织下所有的标签
     *
     * @param orgId 组织id
     * @return List<LabelDO>
     */
    List<LabelDO> listByOrgId(String orgId);

    /**
     * 批量处理行业sample数据
     *
     * @param newLabelList
     */
    void batchSaveSampleData(List<LabelDO> newLabelList);

    /**
     * 统计标签数
     *
     * @param ids
     * @return
     */
    long countByIds(Set<String> ids);

    /**
     * 查询企业标签总数
     * @param orgId 企业标识
     * @return 标签总数
     */
    Long countByOrgId(String orgId);

    /**
     * 查询企业标签总数
     * @param orgId 企业标识
     * @return 标签总数
     */
    List<LabelDO> listByOrgId(String orgId, Integer offset, Integer size);

    /**
     * 根据orgId 和 标签id获取数据
     *
     * @param orgId
     * @param labelIds
     * @return
     */
    List<LabelDO> listByOrgIdAndIds(String orgId, List<String> labelIds);

    /**
     * 根据组织id 和 标签名称获取数据
     *
     * @param orgId
     * @param labelNames
     * @return
     */
    List<LabelDO> listByLabelNames(String orgId, List<String> labelNames);

    /**
     * 根据标签组id列表获取数量
     *
     * @param orgId
     * @param labelGroupIds
     * @return
     */
    Map<String, Integer> countByLabelGroupIds(String orgId, Set<String> labelGroupIds);

    /**
     * 批量创建 标签
     *
     * @param insertedLabels
     * @return
     */
    Collection<LabelDO> batchSave(Collection<LabelDO> insertedLabels);

    /**
     * 更新数据
     *
     * @param updatedLabels
     */
    void batchUpdate(Collection<LabelDO> updatedLabels);
}
